package inteligenciaArtificial;

import java.util.Vector;

import nivel.Coordenada;

import powerup.Dinamico;

/**
 * La clase ControladorPowerUps modela un director que se encarga de controlar
 * los powerups dinamicos. Contiene una coleccion en la cual se almacenan, y brinda
 * metodos para actualizarlo.
 * 
 * @author Agustin Orge (LU.85538)
 * @author Victoria Martinez de la Cruz (LU.87620)
 */
public class ControladorPowerUps implements Runnable {
	/**Coleccion de powerups*/
	private Vector<Dinamico> powerupsDinamicos;
	/**Condicion de corte del bucle*/
	private boolean terminarHilo;
	/**
	 * Constructor del controlador de powerups
	 */
	public ControladorPowerUps() {
		powerupsDinamicos = new Vector<Dinamico>();
		terminarHilo = false;
	}
	/**
	 * Agrega un power up a la coleccion
	 * @param pu - power up a agregar
	 */
	public void agregarPowerUp(Dinamico pu) {
		powerupsDinamicos.add(pu);
	}
	/**
	 * Elimina un power up de la coleccion
	 * @param c - Coordenada del powerup para eliminar
	 */
	public void eliminarPowerUp(Coordenada c) {
		boolean encontre = false;
		int i = 0;

		terminarHilo = true;

		while (!encontre && i < powerupsDinamicos.size()) {
			if (powerupsDinamicos.get(i).getCasilleroActual().getCoordenada()
					.compareTo(c) == 0) {
				encontre = true;
				powerupsDinamicos.get(i).getNivel().getGrafica()
						.getPanelEntidades()
						.eliminarEntidad(powerupsDinamicos.get(i).getLabel());
				powerupsDinamicos.remove(i);

			}
			i++;
		}

		terminarHilo = false;
	}
	/**
	 * Busca un power up en la coleccion
	 * @param c - coordenada del power up a buscar
	 * @return power up buscado, null si no se encuentra
	 */
	public Dinamico buscarPowerUp(Coordenada c) {
		boolean encontre = false;
		Dinamico retorno = null;
		int i = 0;
		while (!encontre && i < powerupsDinamicos.size()) {
			if (powerupsDinamicos.get(i).getCasilleroActual().getCoordenada()
					.compareTo(c) == 0) {
				encontre = true;
				retorno = powerupsDinamicos.get(i);
			}
			i++;
		}
		return retorno;
	}
	
	/**
	 * Metodo que recorre la coleccion y le indica a cada
	 * componente que debe realizar un movimiento
	 */
	private void realizarTickMovimiento() {

		Dinamico aux[] = new Dinamico[powerupsDinamicos.size()];
		powerupsDinamicos.toArray(aux);

		for (int i = 0; i < aux.length; i++) {

			

			if (aux[i].estaActivado()) {
				if (aux[i].getRumbo() == 'd') {
					aux[i].moverDerecha();
				} else {
					aux[i].moverIzquierda();
				}
				
			}
		}

		System.out.println();
	}
	/**
	 * Controla si hay colision con mario
	 * @param pu - power up a controlar
	 */
	public void colisionMario(Dinamico pu) {

		if (pu.getNivel().getMario().getCasilleroActual().getCoordenada()
				.compareTo(pu.getCasilleroActual().getCoordenada()) == 0) {
			pu.getNivel().getMario().agarrarPowerUp(pu);
		}
	}
	/**
	 * Metodo que recorre la coleccion indicandole a cada componente
	 * que debe caer
	 */
	public void tickCaer() {
		for (int i = 0; i < powerupsDinamicos.size(); i++) {
			if (powerupsDinamicos.get(i).estaActivado()) {
				powerupsDinamicos.get(i).caer();
				//colisionMario(powerupsDinamicos.get(i));
			}
		}
	}
	/**
	 * Finaliza el bucle del metodo run(); 
	 */
	public void terminarHilo() {
		terminarHilo = true;
	}
	/**
	 * Recorre la coleccion y controla si hubo colisiones
	 */
	public void controlarColisiones(){
		Dinamico aux[] = new Dinamico[powerupsDinamicos.size()];
		powerupsDinamicos.toArray(aux);

		for (int i = 0; i < aux.length; i++) {
			
			Dinamico d =  aux[i];
			colisionMario(d);
		}
	}
	
	@Override
	public void run() {
		while (!terminarHilo) {
			realizarTickMovimiento();
			try {
				Thread.sleep(250);
			} catch (InterruptedException e) {

				e.printStackTrace();
			}
		}

	}

}
